如何從controller傳遞變數到js
今天來談談這個專案中很常見的需求
先講結論,其實有gem可以簡單的實作
但在介紹gem之前,先來講講一般的方法
熟悉rails運作流程就會知道
從網址到畫面,依序是:
URL > route 解析 > controller > view (js & css)
所以假如想要由controller傳遞變數到js
可以先透過html階段,再由js去html取
html實作上有非常多地方可以讓js抓變數
我個人是推薦使用class或data attribute的方式
假如是想傳遞某種狀態,例如:<div id="main" class="foo baa <%= @status %>" />
全域變數@status由controller準備
def show
    if is_album
        @status = "album"
    end
end
假設內容為頁面型態
這時js可以這樣抓取$("#main").hasClass("album")
可以得到是否是否為album的判斷
假如是值的傳遞<div id="main" data-page_type="<%= @status %>" />
取值方法如下:$("#main").data("page_type")
如果要透過js給值,寫法如下$("#main").data("page_type", "new_type")
會把後面的值塞到前面的key內,頁面上的html會變更如下<div id="main" data-page_type="new_type" />
這樣雖然不算是很麻煩,但是如果數量很多
要在頁面上放一堆變數,還是很麻煩
有人為了解決這個問題,寫了一個很方便的的gem
Gem gon - get your Rails variables in your js
Gemfilegem 'gon'
在共用的html之前引入,例如
app/views/layouts/application.html.erb
<head>
  <title>some title</title>
  <%= Gon::Base.render_data %>
  <!-- include your action js code -->
  ...
如果是Rails 3以前
<head>
  <title>some title</title>
  <%= include_gon %>
  <!-- include your action js code -->
  ...
接著在controller階段,只需要像下面這樣放值
def show
    gon.abc = "abc"
    gon.foo = [1,2,3]
end
在js階段,只要用同名方法就可以直接使用
gon.abc
=> "abc"
gon.foo
=> [1,2,3]
當然,除了字串,數字、陣列等等型態都可以
有沒有覺得瞬間省事很多
上面廢話那麼多是在拖台錢嗎XD
雖然有很多方便的gem可以省力
單身為rails工程師,還是需要知道沒有gem的時候該怎麼做
畢竟有時候會遇到不明原因gem無法支援的情況
我們還是有可能需要手刻
希望大家開發愉快啦!